package org.example.completed.controller;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.example.completed.domain.User;
import org.example.completed.model.dto.UserLoginDto;
import org.example.completed.model.dto.UserMoneyDto;
import org.example.completed.model.dto.UserRegisterDto;
import org.example.completed.model.vo.ResultVO;
import org.example.completed.service.UserService;
import org.example.completed.utils.ApiResponse;
import org.example.completed.utils.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@RestController//@Controller 代表这个类会被springboot 接管
//被@Controller这个注解的类，中的所有方法，如果返回值是String，并且有具体的页面可以跳转，那么就会被视图解析器解析
public class UserController {

    @Autowired
    private UserService userService;

    // 注册
    @PostMapping("/user/save")
    public ApiResponse<?> saveUser(@RequestBody UserRegisterDto userRegisterDto) {
        if (userRegisterDto == null) {
            return ApiResponse.failure("操作失败: 请求参数为空");
        }
        if (userRegisterDto.getUsername() == null || userRegisterDto.getPassword() == null || userRegisterDto.getUserAcoount() == null ||userRegisterDto.getAge() == null || userRegisterDto.getSex() == null) {
            return ApiResponse.failure("操作失败: 请求参数不完整");
        }
        User user = new User();
        user.setUserAcoount(userRegisterDto.getUserAcoount());  // 用户名
        user.setUsername(userRegisterDto.getUsername());    // 账户
        user.setPassword(userRegisterDto.getPassword());    // 建立密码
        user.setSex(userRegisterDto.getSex());  // 建立性别
        user.setAge(userRegisterDto.getAge());  // 创建年龄
        user.setImg(userRegisterDto.getImg());  //补上图片
        // 差个图片

        if (userService.selectUser(user) != null) {
            return ApiResponse.failure("此账号与密码已重复");
        }
        userService.saveUser(user);
        return ApiResponse.success("注册成功","注册成功");
    }


    // 登录
    @PostMapping("/user/login")
    public ApiResponse<?> loginIn(@RequestBody UserLoginDto userLoginDto) {
        // 检查输入
        if (userLoginDto == null) {
            return ApiResponse.failure("操作失败: 输入为空值");
        }

        // 验证用户是否存在
        User user = new User();
        user.setUsername(userLoginDto.getUsername());
        user.setPassword(userLoginDto.getPassword());
        User existingUser = userService.selectUser(user);
        if (existingUser == null) {
            return ApiResponse.failure("无此账号");
        }
        // 用户验证成功，生成 JWT Token
        String token = JwtUtil.createJwtToken(existingUser.getUsername());

        // 生成键值对数据
        Map<String, Object> res = new HashMap<>();
        res.put("token", token);
        res.put("userAccount", existingUser.getUserAcoount());
        res.put("age", existingUser.getAge());
        res.put("sex", existingUser.getSex());
        res.put("money", existingUser.getMoney());
        res.put("img",existingUser.getImg());
        res.put("right",existingUser.getRights());
        res.put("id",existingUser.getId());
        // 将生成的 Token 返回给前端
        return ApiResponse.success(res, "登录成功");
    }

    public static  class UpdateUserRightsRequest {
        private String username;  // 用户名
        private String rights;  // 用户权益（vip 或 普通用户）

        // Getter 和 Setter 方法
        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getRights() {
            return rights;
        }

        public void setRights(String rights) {
            this.rights = rights;
        }
    }

    // 更新用户权益，使用POST请求
    @PostMapping("/rights")
    public ApiResponse updateUserRights(@RequestBody UpdateUserRightsRequest request) {
        // 校验权益值
        if (!request.getRights().equals("vip") && !request.getRights().equals("普通用户")) {
            return ApiResponse.failure("无效的权益类型");
        }
        userService.updateUserRights(request.getUsername(), request.getRights()); // 调用服务层方法更新用户权益
        return ApiResponse.success(null, "用户权益更新成功");
    }


    // 修改本人密码接口
    @PostMapping("/user/updatePassword")
    public ApiResponse<?> updatePassword(@RequestParam String id, @RequestParam String newPassword) {
        if (id == null || newPassword == null) {
            return ApiResponse.failure("操作失败: 请求参数为空");
        }
        boolean isSuccess = userService.updatePassword(id, newPassword);
        if (isSuccess) {
            return ApiResponse.success("密码修改成功", "密码修改成功");
        } else {
            return ApiResponse.failure("密码修改失败");
        }
    }

    // 根据用户id查询money，id放在请求体中
    @PostMapping("/getmoney")
    public ApiResponse getMoneyById(@RequestBody UserMoneyDto request) {
        String id = request.getId();
        Integer money = userService.getMoneyById(id); // 获取money
        if (money == null) {
            return ApiResponse.failure("用户未找到");
        }
        return ApiResponse.success(money, "查询成功");
    }

    /**
     * 获取所有的user信息
     * @return
     */
    @GetMapping
    public ResultVO<List<User>> getAllReservations() {
        List<User> users = userService.list();// 获取预约信息
        return ResultVO.ok(users, "获取所有的user信息成功");  // 使用 ResultVO 返回结果
    }

    /**
     * 修改用户的 money 字段
     * @param userId 用户 ID
     * @param newMoney 新的金额
     * @return ResultVO 结果对象
     */
    @PostMapping("/user/updateMoney")
    public ResultVO<?> updateUserMoney(@RequestParam String userId, @RequestParam BigDecimal newMoney) {
        if (userId == null || newMoney == null) {
            return ResultVO.fail("操作失败: 请求参数为空");
        }
        boolean isSuccess = userService.updateUserMoney(userId, newMoney);
        if (isSuccess) {
            return ResultVO.ok("用户余额更新成功");
        } else {
            return ResultVO.fail("用户余额更新失败");
        }
    }
    /**
     * 修改 userid 对应 user_acoount
     * @param userId 用户 ID
     * @param newUserAcoount 新的 user_acoount
     * @return ResultVO 结果对象
     */
    @PostMapping("/user/updateUserAcoount")
    public ResultVO<?> updateUserAcoount(@RequestParam String userId, @RequestParam String newUserAcoount) {
        User user = new User();
        user.setUserAcoount(newUserAcoount);
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", userId);
        boolean success = userService.update(user, updateWrapper);
        return success ? ResultVO.ok("更新成功") : ResultVO.fail("更新失败");
    }

}

